//============================================================
// File :     CList.h
// Abstract:  环形链表的实现（）
// Change Logs:
// Date           Notes
// 2013-08-02     the first version
//=============================================================


#ifndef __CLIST_H__
#define __CLIST_H__



#ifdef __cplusplus
extern "C" {
#endif

#include "ooc_typedef.h"    

    typedef struct _list {
        void* pUser;
        struct _list* pLeft; //左结点
        struct _list* pRight; //右结点
    } CListDef; //链表定义


    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //name:     List_Init
    //brief:	模块对象初始化
    //input:	<1> cthis 模块对象
    //          <2> pUser 链表的用户
    //return:	无
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void CList_Init(CListDef * cthis, void* pUser);


    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //name:     CList_AppendToLeft
    //brief:    在链表左端添加结点
    //input:	<1> cthis 模块对象
    //          <2> pNode要添加的结点
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void CList_AppendToLeft(CListDef * cthis, CListDef* pNode);

    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //name:     CList_AppendToRight
    //brief:    在链表右端添加结点
    //input:	<1> cthis 模块对象
    //          <2> pNode要添加的结点
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void CList_AppendToRight(CListDef * cthis, CListDef* pNode);    
    
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //name:	CList_InsertToLeft
    //brief:	添加结点到左边
    //input:	<1> cthis 模块对象
    //		<2> pNode要添加的结点
    //return:	无
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void CList_InsertToLeft(CListDef * cthis, CListDef* pNode);

    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //name:	CList_InsertToRight
    //brief:	添加结点到右边
    //input:	<1> cthis 模块对象
    //		<2> pNode要添加的结点
    //return:	无
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void CList_InsertToRight(CListDef * cthis, CListDef* pNode);


    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //name:	CList_Remove
    //brief:	删除结点
    //input:	<1> pNode要删除的结点
    //return:	无
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void CList_Remove(CListDef* pNode);

    
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //name:     CList_LengthLeft
    //brief:    计算链表左侧的长度(结点数量，不包括首结点)
    //input:	<1> cthis 模块对象
    //		<2> pNode要添加的结点
    //return:	长度值
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    mu32 CList_LengthLeft(CListDef* cthis);

    
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //name:     CList_LengthRigth
    //brief:    计算链表左侧的长度(结点数量，不包括首结点)
    //input:	<1> cthis 模块对象
    //		<2> pNode要添加的结点
    //return:	长度值
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    mu32 CList_LengthRigth(CListDef* cthis);    

    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //name:     CList_GetTheMostRight
    //brief:    获取最右端的结点
    //input:    <1> cthis   链表中任一结点
    //return:   最右边的结点
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    CListDef* CList_GetTheMostRight(CListDef* cthis);
    
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //name:     CList_GetTheMostLest
    //brief:    获取最左端的结点
    //input:    <1> cthis   链表中任一结点
    //return:   最左边的结点
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
    CListDef* CList_GetTheMostLest(CListDef* cthis);
            
    
#ifdef __cplusplus
}
#endif


#endif
